﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataTier
{
    [Serializable]
    public class Data_Klagebrev
    {
        private Data_Klagebrev()
        {

        }

        #region Properties
        private int org_klagenr = int.MinValue;

        public int OrgKlagenr
        {
            get { return org_klagenr; }
            set { org_klagenr = value; }
        }
        private string skattecenter_adr = "";

        public string SkattecenterAdr
        {
            get { return skattecenter_adr; }
            set { skattecenter_adr = value; }
        }
        private string skattecenter_postnr = "";

        public string SkattecenterPostnr
        {
            get { return skattecenter_postnr; }
            set { skattecenter_postnr = value; }
        }
        private string skattecenter_by = "";

        public string SkattecenterBy
        {
            get { return skattecenter_by; }
            set { skattecenter_by = value; }
        }
        private DateTime oprettet_dato = DateTime.MinValue;

        public DateTime OprettetDato
        {
            get { return oprettet_dato; }
            set { oprettet_dato = value; }
        }
        private string matr_nr = "";

        public string MatrNr
        {
            get { return matr_nr; }
            set { matr_nr = value; }
        }
        private string sum_beskrivelse = "";

        public string SumBeskrivelse
        {
            get { return sum_beskrivelse; }
            set { sum_beskrivelse = value; }
        }
        private string lokalplannr = "";

        public string LokalplanNr
        {
            get { return lokalplannr; }
            set { lokalplannr = value; }
        }
        private string lokalplanformaal = "";

        public string LokalplanFormaal
        {
            get { return lokalplanformaal; }
            set { lokalplanformaal = value; }
        }
        private string udnyttelsesprocent = "";

        public string UdnyttelsesProcent
        {
            get { return udnyttelsesprocent; }
            set { udnyttelsesprocent = value; }
        }
        private bool forurening = false;

        public bool Forurening
        {
            get { return forurening; }
            set { forurening = value; }
        }
        private string v2 = "";

        public string V2
        {
            get { return v2; }
            set { v2 = value; }
        }
        private string kortlaegningsnr = "";

        public string KortlaegningsNr
        {
            get { return kortlaegningsnr; }
            set { kortlaegningsnr = value; }
        }
        private string startforrentning = "";

        public string StartForrentning
        {
            get { return startforrentning; }
            set { startforrentning = value; }
        }
        private double faktor = double.MinValue;

        public double Faktor
        {
            get { return faktor; }
            set { faktor = value; }
        }
        private double skat_afg = double.MinValue;

        public double SkatAfg
        {
            get { return skat_afg; }
            set { skat_afg = value; }
        }
        private double forsikring_m2 = 11.0;

        public double ForsikringM2
        {
            get { return forsikring_m2; }
            set { forsikring_m2 = value; }
        }
        private double vedl_udg_m2 = 60.0;

        public double VedlUdgM2
        {
            get { return vedl_udg_m2; }
            set { vedl_udg_m2 = value; }
        }

        private int adm_udg_pct = int.MinValue;

        public int AdmUdgPct
        {
            get { return adm_udg_pct; }
            set { adm_udg_pct = value; }
        }

        private double renhold_udg_m2 = 10.0;

        public double RenholdUdgM2
        {
            get { return renhold_udg_m2; }
            set { renhold_udg_m2 = value; }
        }

        private int klagenr = int.MinValue;

        public int KlageNr
        {
            get { return klagenr; }
            set { klagenr = value; }
        }
        private List<Klage_billede> billeder = new List<Klage_billede>();

        public List<Klage_billede> Billeder
        {
            get { return billeder; }
            set { billeder = value; }
        }


        #endregion

        public static Data_Klagebrev Load(string connStr, int org_klagenr)
        {
            var toReturn = new Data_Klagebrev();
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlStr = "select * from data_klagebrev where org_klagenr = " + org_klagenr;
                    var sqlCommand = new SqlCommand(sqlStr, conn);
                    var sqlReader = sqlCommand.ExecuteReader();

                    if (sqlReader.Read())
                    {
                        toReturn.org_klagenr = int.Parse(sqlReader.GetInt16(0).ToString());
                        toReturn.skattecenter_adr = sqlReader.GetString(1);
                        toReturn.skattecenter_postnr = sqlReader.GetString(2);
                        toReturn.skattecenter_by = sqlReader.GetString(3);
                        toReturn.oprettet_dato = sqlReader.GetDateTime(4);
                        toReturn.matr_nr = sqlReader.GetString(5);
                        toReturn.sum_beskrivelse = sqlReader.GetString(6);
                        toReturn.lokalplannr = sqlReader.GetString(7);
                        toReturn.lokalplanformaal = sqlReader.GetString(8);
                        toReturn.udnyttelsesprocent = sqlReader.GetString(9);
                        toReturn.forurening = sqlReader.GetBoolean(10);
                        toReturn.v2 = sqlReader.GetString(11);
                        toReturn.kortlaegningsnr = sqlReader.GetString(12);
                        toReturn.startforrentning = sqlReader.GetString(13);
                        toReturn.faktor = sqlReader.GetDouble(14);
                        toReturn.skat_afg = sqlReader.GetDouble(15);
                        toReturn.forsikring_m2 = sqlReader.GetDouble(16);
                        toReturn.vedl_udg_m2 = sqlReader.GetDouble(17);
                        toReturn.adm_udg_pct = int.Parse(sqlReader.GetInt16(18).ToString());
                        toReturn.renhold_udg_m2 = sqlReader.GetDouble(19);
                        toReturn.klagenr = int.Parse(sqlReader.GetInt16(20).ToString());

                        toReturn.billeder = Klage_billede.Load(connStr, toReturn.klagenr);
                    }
                    else
                        throw new KeyNotFoundException("Kunne ikke finde data_klagebrev med Org_klagenr: " + org_klagenr);
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                    throw new ArgumentException("Could not be found " + org_klagenr);
                }
                finally
                {
                    conn.Close();
                }
            }
            return toReturn;

        }
        public string GetVurderingsMeddelese(string vurderingsPath, string targetPath)
        {
            var strFile = findVurderingsmeddelse(vurderingsPath);
            if (strFile != string.Empty)
            {
                if (File.Exists(strFile))
                {
                    try
                    {
                        var fi = new FileInfo(strFile);
                        var targetFile = targetPath + "/" + fi.Name;
                        if (!File.Exists(targetFile))
                        {
                            File.Copy(strFile, targetFile);
                        }
                        return fi.Name;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Console.WriteLine(ex.StackTrace);
                    }
                }
            }
            return string.Empty;
        }

        private string findVurderingsmeddelse(string vurderingsPath)
        {
            var toReturn = string.Empty;

            //try
            //{
                if (Directory.Exists(vurderingsPath))
                {
                    foreach (var fileName in Directory.GetFiles(vurderingsPath))
                    {
                        var klagenrStr = fileName.Substring(vurderingsPath.Length+1, this.org_klagenr.ToString().Length);

                        int klageNr = int.MinValue;
                        if (int.TryParse(klagenrStr, out klageNr))
                        {
                            if (klageNr == this.org_klagenr)
                            {
                                toReturn = fileName;
                                break;
                            }
                        }
                    }
                }
            //}
            //catch (Exception ex)
            //{
            //    Console.WriteLine(ex.Message);
            //    Console.WriteLine(ex.StackTrace);
            //}


            return toReturn;
        }

        public static Data_Klagebrev Insert(string connStr, int org_klagenr)
        {
            var toReturn = new Data_Klagebrev
            {
                org_klagenr = org_klagenr
            };
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlCommand = new SqlCommand("insert into data_klagebrev (org_klagenr, skattecenter_adr, skattecenter_postnr, skattecenter_by, oprettet_dato, matr_nr, sum_beskrivelse, lokalplannr, lokalplanformaal, udnyttelsesprocent, forurening, v2, kortlaegningsnr, startforrentning, faktor, skat_afg, forsikring_m2, vedl_udg_m2, adm_udg_pct, rengold_udg_m2) values (@org_klagenr, @skattecenter_adr, @skattecenter_postnr, @skattecenter_by, @oprettet_dato, @matr_nr, @sum_beskrivelse, @lokalplannr, @lokalplanformaal, @udnyttelsesprocent, @forurening, @v2, @kortlaegningsnr, @startforrentning, @faktor, @skat_afg, @forsikring_m2, @vedl_udg_m2, @adm_udg_pct, @rengold_udg_m2)", conn);

                    sqlCommand.Parameters.Add("@org_klagenr", SqlDbType.SmallInt);
                    sqlCommand.Parameters.Add("@skattecenter_adr", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@skattecenter_postnr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@skattecenter_by", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@oprettet_dato", SqlDbType.DateTime);
                    sqlCommand.Parameters.Add("@matr_nr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@sum_beskrivelse", SqlDbType.Text);
                    sqlCommand.Parameters.Add("@lokalplannr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@lokalplanformaal", SqlDbType.Text);
                    sqlCommand.Parameters.Add("@udnyttelsesprocent", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@forurening", SqlDbType.Bit);
                    sqlCommand.Parameters.Add("@v2", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@kortlaegningsnr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@startforrentning", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@faktor", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@skat_afg", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@forsikring_m2", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@vedl_udg_m2", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@adm_udg_pct", SqlDbType.SmallInt);
                    sqlCommand.Parameters.Add("@rengold_udg_m2", SqlDbType.Float);

                    sqlCommand.Parameters["@org_klagenr"].Value = toReturn.org_klagenr;
                    sqlCommand.Parameters["@skattecenter_adr"].Value = "";
                    sqlCommand.Parameters["@skattecenter_postnr"].Value = "";
                    sqlCommand.Parameters["@skattecenter_by"].Value = "";
                    sqlCommand.Parameters["@oprettet_dato"].Value = DateTime.Now;
                    sqlCommand.Parameters["@matr_nr"].Value = "";
                    sqlCommand.Parameters["@sum_beskrivelse"].Value = "";
                    sqlCommand.Parameters["@lokalplannr"].Value = "";
                    sqlCommand.Parameters["@lokalplanformaal"].Value = "";
                    sqlCommand.Parameters["@udnyttelsesprocent"].Value = "";
                    sqlCommand.Parameters["@forurening"].Value = false;
                    sqlCommand.Parameters["@v2"].Value = "";
                    sqlCommand.Parameters["@kortlaegningsnr"].Value = "";
                    sqlCommand.Parameters["@startforrentning"].Value = "";
                    sqlCommand.Parameters["@faktor"].Value = -1;
                    sqlCommand.Parameters["@skat_afg"].Value = -1;
                    sqlCommand.Parameters["@forsikring_m2"].Value = -1;
                    sqlCommand.Parameters["@vedl_udg_m2"].Value = -1;
                    sqlCommand.Parameters["@adm_udg_pct"].Value = -1;
                    sqlCommand.Parameters["@rengold_udg_m2"].Value = -1;

                    var sqlReader = sqlCommand.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
                finally
                {
                    conn.Close();
                }
            }
            return Load(connStr, org_klagenr);


        }

        public void Save(string connStr)
        {
            foreach (var billede in this.billeder)
            {
                billede.KlageNr = this.klagenr;
                billede.Save(connStr);
            }

            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlCommand = new SqlCommand("update data_klagebrev set org_klagenr = @org_klagenr, skattecenter_adr = @skattecenter_adr, skattecenter_postnr = @skattecenter_postnr, skattecenter_by = @skattecenter_by, oprettet_dato = @oprettet_dato, matr_nr = @matr_nr, sum_beskrivelse = @sum_beskrivelse, lokalplannr = @lokalplannr, lokalplanformaal = @lokalplanformaal, udnyttelsesprocent = @udnyttelsesprocent, forurening = @forurening, v2	= @v2, kortlaegningsnr = @kortlaegningsnr, startforrentning = @startforrentning, faktor	=  @faktor, skat_afg = @skat_afg, forsikring_m2 = @forsikring_m2, vedl_udg_m2 = @vedl_udg_m2, adm_udg_pct = @adm_udg_pct, rengold_udg_m2 = @rengold_udg_m2 where klagenr = @klagenr", conn);

                    sqlCommand.Parameters.Add("@org_klagenr", SqlDbType.SmallInt);
                    sqlCommand.Parameters.Add("@skattecenter_adr", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@skattecenter_postnr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@skattecenter_by", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@oprettet_dato", SqlDbType.DateTime);
                    sqlCommand.Parameters.Add("@matr_nr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@sum_beskrivelse", SqlDbType.Text);
                    sqlCommand.Parameters.Add("@lokalplannr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@lokalplanformaal", SqlDbType.Text);
                    sqlCommand.Parameters.Add("@udnyttelsesprocent", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@forurening", SqlDbType.Bit);
                    sqlCommand.Parameters.Add("@v2", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@kortlaegningsnr", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@startforrentning", SqlDbType.VarChar, 50);
                    sqlCommand.Parameters.Add("@faktor", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@skat_afg", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@forsikring_m2", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@vedl_udg_m2", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@adm_udg_pct", SqlDbType.SmallInt);
                    sqlCommand.Parameters.Add("@rengold_udg_m2", SqlDbType.Float);
                    sqlCommand.Parameters.Add("@klagenr", SqlDbType.SmallInt);

                    sqlCommand.Parameters["@org_klagenr"].Value = this.org_klagenr;
                    sqlCommand.Parameters["@skattecenter_adr"].Value = this.skattecenter_adr;
                    sqlCommand.Parameters["@skattecenter_postnr"].Value = this.skattecenter_postnr;
                    sqlCommand.Parameters["@skattecenter_by"].Value = this.skattecenter_by;
                    sqlCommand.Parameters["@oprettet_dato"].Value = this.oprettet_dato;
                    sqlCommand.Parameters["@matr_nr"].Value = this.matr_nr;
                    sqlCommand.Parameters["@sum_beskrivelse"].Value = this.sum_beskrivelse;
                    sqlCommand.Parameters["@lokalplannr"].Value = this.lokalplannr;
                    sqlCommand.Parameters["@lokalplanformaal"].Value = this.lokalplanformaal;
                    sqlCommand.Parameters["@udnyttelsesprocent"].Value = this.udnyttelsesprocent;
                    sqlCommand.Parameters["@forurening"].Value = this.forurening;
                    sqlCommand.Parameters["@v2"].Value = this.v2;
                    sqlCommand.Parameters["@kortlaegningsnr"].Value = this.kortlaegningsnr;
                    sqlCommand.Parameters["@startforrentning"].Value = this.startforrentning;
                    sqlCommand.Parameters["@faktor"].Value = this.faktor;
                    sqlCommand.Parameters["@skat_afg"].Value = this.skat_afg;
                    sqlCommand.Parameters["@forsikring_m2"].Value = this.forsikring_m2;
                    sqlCommand.Parameters["@vedl_udg_m2"].Value = this.vedl_udg_m2;
                    sqlCommand.Parameters["@adm_udg_pct"].Value = this.adm_udg_pct;
                    sqlCommand.Parameters["@rengold_udg_m2"].Value = this.renhold_udg_m2;
                    sqlCommand.Parameters["@klagenr"].Value = this.klagenr;

                    var sqlReader = sqlCommand.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
                finally
                {
                    conn.Close();
                }
            }
        }

        public string ToHTMLString(string connStr)
        {
            CultureInfo cul = new CultureInfo("da-DK");
            var orgData = Org_Klagedata.Load(connStr, this.org_klagenr);

            var sb = new StringBuilder();
            sb.AppendLine("<table width='100%'><tr><td><b>SKAT</b><br/></td></tr>");
            sb.AppendLine("<tr><td>Ejendomsvurdering</td></tr>");
            sb.AppendLine(string.Format("<tr><td>{0}", this.skattecenter_adr) + "</td></tr>");
            sb.AppendLine(string.Format("<tr><td>{0} {1}", this.skattecenter_postnr, this.skattecenter_by) + "</td></tr>");
            sb.AppendLine("<tr><td>&nbsp;</td></tr>");
            sb.AppendLine("<tr><td><b>Indsendt pr. mail til raadgiver@skat.dk</b></td></tr>");
            sb.AppendLine("<tr><td>&nbsp;</td></tr>");
            sb.AppendLine(string.Format("<tr><td>København Ø, den {0}", DateTime.Now.ToString("d", cul)) + "</td></tr>");
            sb.AppendLine(string.Format("<tr><td>Internt sagsnr: {0}", this.org_klagenr) + "</td></tr>");
            sb.AppendLine("<tr><td>&nbsp;</td></tr>");
            sb.AppendLine(string.Format("<tr><td><b>Klage over ejendomsvurderingen - {0}, beliggende {1}, {2} {3}. Ejendomsnr {4}-{5}</b>", this.matr_nr, orgData.EjdAdresse, orgData.EjdPostnr, orgData.EjdBy, orgData.EjdKommuneNr, orgData.EjdNr) + "</td></tr>");
            sb.AppendLine(string.Format("<tr><td>På foranledning af, og med fuldmagt fra ejendommens {0}, {1} skal vi hermed påklage vurderingen pr. 1. oktober 2012 som værende for høj og ude af trit med markedsvilkårene på vurderingstidspunktet.</td></tr>", orgData.EjdType.ToString().ToLower(), orgData.EjdKontakt));
            sb.AppendLine("<tr><td>&nbsp;<br/></td></tr>");
            sb.AppendLine("<tr><td><b>Summarisk beskrivelse:</b></td></tr>");
            sb.AppendLine(string.Format("<tr><td>{0} </td></tr>", this.sum_beskrivelse));
            sb.AppendLine("<tr><td><b>Planforhold:</b></td></tr>");
            sb.AppendLine(string.Format("<tr><td>Ejendommen er omfattet af lokalplan {0} der udlægger området til {1} med en udnyttelsesgrad på {2} %.<br/></td></tr>", this.lokalplannr, this.LokalplanFormaal, this.udnyttelsesprocent));
            if (this.forurening)
            {
                sb.AppendLine("<tr><td><br/><b>Forurening:</b><br/></td></tr>");
                sb.AppendLine(string.Format("<tr><td>Ejendommen er kortlagt som forurenet på {0} niveau under kortlægningsnummer {1}<br/></td></tr>", this.v2, this.kortlaegningsnr));
            }
            sb.AppendLine("<tr><td><br/><b>Markedsleje og værdiberegning:</b></td></tr>");
            sb.AppendLine("<tr><td>Med henblik på fastlæggelse af ejendommens værdi pr. 1. oktober 2012 har vi udarbejdet nedenstående skema visende markedsværdi for de respektive lokaletyper tillige med de driftsomkostninger, der påhviler ejendommen<br/></td></tr>");
            sb.AppendLine("<tr><td>Ved fastlæggelse af startforrentningsprocenten er der taget hensyn til at ledighedsprocent indenfor ejendomstypen på 18% jr. databasen www.oline.dk.<br/></td></tr>");
            sb.AppendLine(string.Format("<tr><td>Endelig er værdien fastlagt ud fra en for ejendomstypen og markedsvilkårene i efteråret 2012 gældende startforrentningsprocent på {0} svarende til faktor {1}<br/></td></tr>", this.startforrentning, this.faktor.ToString("N2", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine("<tr><td><br/><table border='1' width='100%' style='margin:0px; padding:0px; page-break-before: always; border:1px solid black; border-collapse:collapse;'><tr><th width='80'>BBR</th><th style='border: 1px solid black'>Arealtype</th><th style='border: 1px solid black'>Areal</th><th style='border: 1px solid black'>Leje pr. kvm./sats</th><th style='border: 1px solid black'>Udgifter</th><th align='right'>I alt</th></tr>");
            sb.AppendLine("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td></tr>");
            double sumAreal = 0;
            double sumLeje = 0;
            foreach (var areal in Areal_Data.Load(connStr, this.klagenr))
            {
                sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>{0}</td><td style='border: 1px solid black'>{1}</td><td align='right' style='border: 1px solid black'>{2}</td><td align='right' style='border: 1px solid black'>{3}</td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'>{4}</td></tr>", areal.Bbr_nr, areal.ArealType, areal.Areal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), areal.ArealPris.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), (areal.Areal * areal.ArealPris).ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
                sumAreal += areal.Areal;
                sumLeje += areal.Areal * areal.ArealPris;
            }
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'><b>Samlet lejeværdi</b></td><td align='right' style='border: 1px solid black'><b>{0}</b></td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'><b>{1}</b></td></tr>", sumAreal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), sumLeje.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td></tr>");
            sb.AppendLine("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td></tr>");
            sb.AppendLine("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'><b>Udgifter:</b></td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td></tr>");
            var skatPrM2 = this.skat_afg / sumAreal;
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>Skatter og afgifter</td><td align='right' style='border: 1px solid black'>{0}</td><td align='right' style='border: 1px solid black'>{1}</td><td align='right' style='border: 1px solid black'>{2}</td><td style='border: 1px solid black'>&nbsp;</td></tr>", sumAreal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), skatPrM2.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), this.skat_afg.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>Forsikring</td><td align='right' style='border: 1px solid black'>{0}</td align='right'><td align='right' style='border: 1px solid black'>{1}</td><td align='right' style='border: 1px solid black'>{2}</td><td style='border: 1px solid black'>&nbsp;</td></tr>", sumAreal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), this.forsikring_m2.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), (sumAreal * this.forsikring_m2).ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>Vedligeholdelse</td><td align='right' style='border: 1px solid black'>{0}</td><td align='right' style='border: 1px solid black'>{1}</td><td align='right' style='border: 1px solid black'>{2}</td><td style='border: 1px solid black'>&nbsp;</td></tr>", sumAreal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), this.vedl_udg_m2.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), (sumAreal * this.vedl_udg_m2).ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>Administration i % af husleje</td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'>{0}%</td><td align='right' style='border: 1px solid black'>{1}</td><td style='border: 1px solid black'>&nbsp;</td></tr>", this.adm_udg_pct.ToString("N2", CultureInfo.CreateSpecificCulture("da-DK")), (sumLeje * this.adm_udg_pct / 100).ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>Renholdelse</td><td align='right' style='border: 1px solid black'>{0}</td><td align='right' style='border: 1px solid black'>{1}</td><td align='right' style='border: 1px solid black'>{2}</td><td style='border: 1px solid black'>&nbsp;</td></tr>", sumAreal.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), this.renhold_udg_m2.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK")), (sumAreal * this.renhold_udg_m2).ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));

            var sumUdg = this.skat_afg + (this.forsikring_m2 * sumAreal) + (this.vedl_udg_m2 * sumAreal) + (sumLeje * this.adm_udg_pct / 100) + (this.renhold_udg_m2 * sumAreal);
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'>Totale udgifter:</td><td align='right' style='border: 1px solid black'>{0}</td><td align='right' style='border: 1px solid black'>{0}</td></tr>", sumUdg.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));

            var nettoLejeværdi = sumLeje - sumUdg;
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'><b>Nettolejeværdi</b></td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'><b>{0}</b></td></tr>", nettoLejeværdi.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'>&nbsp;</td></tr>");
            var ejdVærdiBer = nettoLejeværdi * this.faktor;
            sb.AppendLine(string.Format("<tr><td style='border: 1px solid black'>&nbsp;</td><td style='border: 1px solid black'><b>Værdi ved startforrentning</b></td><td align='right' style='border: 1px solid black'><b>{0}</b></td><td align='right' style='border: 1px solid black'><b>Svarende til faktor: {1}</b></td><td style='border: 1px solid black'>&nbsp;</td><td align='right' style='border: 1px solid black'><b>{2}</b></td></tr>", this.startforrentning, this.faktor.ToString("N2", CultureInfo.CreateSpecificCulture("da-DK")), ejdVærdiBer.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"))));
            sb.AppendLine("</table></td></tr>");
            sb.AppendLine("<tr><td><br/>I overensstemmelse med vor værdifastansættelse af ejendommen skal vi hermed anmode vurderingsmyndigheden nedsætte den offentlige vurdering pr. 1. oktober 2012 til:</td></tr>");
            sb.AppendLine(string.Format("<tr><td align='center'><b>kr. {0}</b></td></tr>", roundEjdVal(ejdVærdiBer)));
            sb.AppendLine("<tr><td><br />Vi beder dem venligst bekræfte modtagelsen af nærværende klage samt kontakte undertegnede for evt. yderligere oplysninger og besigtigelse af ejendommen.</td></tr>");
            sb.AppendLine("<tr><td>Vi skal for god ordens skyld oplyse, at vi gerne tager en telefonisk drøftelse vedrørende vores synspunkter med henblik på sagens fremme.</td></tr>");
            sb.AppendLine("<tr><td><br /><br />Med venlig hilsen<br/><b>reinholdt as</b><br/><br/>Peter Reinholdt<br/>Statsaut. ejendomsmægler og valuar, mde</td></tr>");
            sb.AppendLine("<tr><td align='center'><span style='color: green'>reinholdt as<br/>statsaut. ejendomsmæglere & valuarer, mde<br/>Lyngbyvej 24, 2100 København Ø - 7023 4711</span></td></tr></table>");

            return sb.ToString();

        }

        private static string roundEjdVal(double ejdVærdiBer)
        {
            var cul = CultureInfo.CreateSpecificCulture("da-DK");
            if (ejdVærdiBer < 100000)
                return (Math.Round(ejdVærdiBer/1000, 0)*1000).ToString("N0", cul);
            else if (ejdVærdiBer >= 100000 & ejdVærdiBer < 1000000)
                return (Math.Round(ejdVærdiBer / 10000, 0) * 10000).ToString("N0", cul);
            else if (ejdVærdiBer >= 1000000 & ejdVærdiBer < 10000000)
                return (Math.Round(ejdVærdiBer / 50000, 0) * 50000).ToString("N0", cul);
            else if (ejdVærdiBer >= 10000000 & ejdVærdiBer < 25000000)
                return (Math.Round(ejdVærdiBer / 100000, 0) * 100000).ToString("N0", cul);
            else if (ejdVærdiBer >= 25000000 & ejdVærdiBer < 50000000)
                return (Math.Round(ejdVærdiBer / 500000, 0) * 500000).ToString("N0", cul);
            else
                return (Math.Round(ejdVærdiBer / 1000000, 0) * 1000000).ToString("N0", cul);


        }

        public string GetSubjet(string connStr)
        {
            var orgData = Org_Klagedata.Load(connStr, this.org_klagenr);
            return string.Format("Klage over ejendomsvurderingen - {0}, beliggende {1}, {2} {3}. Ejendomsnr {4}-{5}", this.matr_nr, orgData.EjdAdresse, orgData.EjdPostnr, orgData.EjdBy, orgData.EjdKommuneNr, orgData.EjdNr);
        }


    }
}
